home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / swaga_c.zip / CHARS.SWG / 0008_Font Library for Text.pas < prev    next >
Pascal/Delphi Source File  |  1993-11-26  |  5KB  |  222 lines

  1. {
  2. User font library for text mode.
  3. }
  4.  
  5.  
  6. {$IFDEF DPMI}
  7. {$X+,S-}
  8. {$ELSE}
  9. {$X+,F+,O+}
  10. {$ENDIF}
  11. unit BBFont;
  12.  
  13. interface
  14.  
  15. const
  16.   FontHeight = 16;   { 14 for EGA mode }
  17.  
  18. type
  19.   PCharShape = ^TCharShape;
  20.   TCharShape = array[0..FontHeight-1] of byte;
  21.  
  22. var
  23.   points : word;
  24.  
  25.  
  26. procedure ReplaceChar(c : char; NewChar : PCharShape);
  27.  
  28.  
  29. implementation
  30.  
  31.  
  32. {*******************************************************************}
  33. { Wen 03-mrt-1993 - wvl                                             }
  34. {                                                                   }
  35. { Get font block index of current (resident) and alternate          }
  36. { character set. Up to two fonts can be active at the same time     }
  37. {                                                                   }
  38. {*******************************************************************}
  39.  
  40. Type
  41.   FontBlock    = 0..7;
  42.  
  43.  
  44. Procedure GetFontBlock(Var primary, secondary : FontBlock); Assembler;
  45.  
  46. ASM
  47.   { Get character map select register:
  48.     (VGA sequencer port 3C4h/3C5h index 3)
  49.  
  50.     7  6  5  4  3  2  1  0
  51.           3  3  3  3  3  3
  52.           3  3  3  3  @DDADD   Primary font   (lower 2 bits)
  53.           3  3  @DDADDDDDDDD   Secondary font (lower 2 bits)
  54.           3  @DDDDDDDDDDDDDD   Primary font   (high bit)
  55.           @DDDDDDDDDDDDDDDDD   Secondary font (high bit)     }
  56.  
  57.         MOV     AL, 3
  58.         MOV     DX, 3C4h
  59.         OUT     DX, AL
  60.         INC     DX
  61.         IN      AL, DX
  62.         MOV     BL, AL
  63.         PUSH    AX
  64.  
  65.   { Get secondary font number: add up bits 5, 3 and 2 }
  66.  
  67.         SHR     AL, 1
  68.         SHR     AL, 1
  69.         AND     AL, 3
  70.         TEST    BL, 00100000b
  71.         JZ      @1
  72.         ADD     AL, 4
  73. @1:     LES     DI, secondary
  74.         STOSB
  75.  
  76.   { Get primary font number: add up bits 4, 1 and 0 }
  77.  
  78.         POP     AX
  79.         AND     AL, 3
  80.         TEST    BL, 00010000b
  81.         JZ      @2
  82.         ADD     AL, 4
  83. @2:     LES     DI, primary
  84.         STOSB
  85. end;  { GetFontBlock }
  86.  
  87.  
  88.  
  89. function postinc(var w : word) : word;  assembler;
  90. asm
  91.   les  di,w
  92.   mov  ax,word ptr es:[di]
  93.   inc  word ptr es:[di]
  94. end;
  95. {* pascal code
  96. begin
  97.   postinc := w;
  98.   inc(w);
  99. end;
  100. *}
  101.  
  102.  
  103. procedure ReplaceChar(c : char; NewChar : PCharShape);
  104. var
  105.   i : integer;
  106.   off : word;
  107.   CharPos : word;
  108.   primfont, secfont : FontBlock;
  109.   base : word;
  110. begin
  111.  
  112. {* program the VGA controller *}
  113.   asm
  114.     pushf               { Disable interrupts }
  115.     cli
  116.     mov  dx, 03c4h      { Sequencer port address }
  117.     mov  ax, 0704h      { Sequential addressing }
  118.     out  dx, ax
  119.     mov  dx, 03ceh      { Graphics Controller port address }
  120.     mov  ax, 0204h      { Select map 2 for CPU reads }
  121.     out  dx, ax
  122.     mov  ax, 0005h      { Disable odd-even addressing }
  123.     out  dx, ax
  124.     mov  ax, 0406h      { Map starts at A000:0000 (64K mode) }
  125.     out  dx, ax
  126.     mov  dx, 03c4h      { Sequencer port address }
  127.     mov  ax, 0402h      { CPU writes only to map 2 }
  128.     out  dx, ax
  129.   end;
  130.  
  131. { first get the current font *}
  132.   GetFontBlock(primfont, secfont);
  133.   base := 8192*primfont;
  134.  
  135.   off := 16 - points;
  136.  
  137.   CharPos := Ord(c) * 32;
  138.  
  139.   for i := 0 to points-1 do  begin
  140.     mem[SegA000:base+postinc(CharPos)] := NewChar^[postinc(off)];
  141.   end;
  142.  
  143. { Ok, put the Sequencer and Graphics Controller back to normal }
  144.  
  145.   asm
  146.  
  147.   { Program the Sequencer }
  148.     pushf               { Disable interrupts }
  149.     cli
  150.     mov dx, 3c4h        { Sequencer port address }
  151.     mov ax, 0302h       { CPU writes to maps 0 and 1 }
  152.     out dx, ax
  153.     mov ax, 0304h       { Odd-even addressing }
  154.     out dx, ax
  155.  
  156.   { Program the Graphics Controller }
  157.     mov dx, 3ceh        { Graphics Controller port address }
  158.     mov ax, 0004h       { Select map 0 for CPU reads }
  159.     out dx, ax
  160.     mov ax, 1005h       { Enable odd-even addressing }
  161.     out dx, ax;
  162.     mov ax,Seg0040
  163.     mov es,ax
  164.     mov ax, 0e06h       { Map starts at B800:0000 }
  165.     mov bl, 7
  166.     cmp es:[49h], bl    { Get current video mode }
  167.     jne @@notmono
  168.     mov ax, 0806h       { Map starts at B000:0000 }
  169. @@notmono:
  170.     out dx, ax;
  171.     popf;
  172.   end;
  173. end;
  174.  
  175.  
  176. begin
  177.   if (Mem[Seg0040:$0084] = 0)
  178.    then  points := 8
  179.    else  begin
  180.      if Mem[Seg0040:$0084] in [42,49]
  181.       then  points := 13
  182.       else  points := Mem[Seg0040:$0085];
  183.    end;
  184. end.  { of unit BBFont }
  185.  
  186.  
  187.  
  188. program Test;
  189.  
  190. uses BBFont,...;
  191.  
  192. procedure TestFont;
  193. const
  194.   NewA:TCharShape = (
  195.     $FF,  {11111111}
  196.     $00,  {00000000}
  197.     $FF,  {11111111}
  198.     $00,  {00000000}
  199.     $00,  {00000000}
  200.     $00,  {00000000}
  201.     $00,  {00000000}
  202.     $00,  {00000000}
  203.     $00,  {00000000}
  204.     $00,  {00000000}
  205.     $00,  {00000000}
  206.     $00,  {00000000}
  207.     $00,  {00000000}
  208.     $00,  {00000000}
  209.     $00,  {00000000}
  210.     $00   {00000000}
  211.   );
  212. begin
  213.   ReplaceChar('A', @NewA);
  214. end;
  215.  
  216.  
  217. begin
  218.   TestFont;
  219. end.
  220.  
  221.  
  222.